﻿using System;
using System.Collections.Generic;
using System.Windows.Forms;
using AlgorytmyGenetyczne;
using AlgorytmyGenetyczne.Kodowania;

namespace AlgorytmyGenetyczneGUI
{
    [Serializable]
    public partial class UserControlParametry : UserControl
    {

        private const string NazwaKodowanieBinarne = "Binarne";
        private const string NazwaKodowanieGraya = "Graya";

        #region Wlasciwosci

        public int IloscPokolen
        {
            get
            {
                WypelnianieKontrolek.wpiszZeroDoTextBoxJesliPusty(textBoxIloscPokolen);
                return Int32.Parse(textBoxIloscPokolen.Text);
            }
            set
            {
                textBoxIloscPokolen.Text = value.ToString();
            }
        }

        public double PrawdopodobienstwoKrzyzowania
        {
            get
            {
                WypelnianieKontrolek.wpiszZeroDoTextBoxJesliPusty(textBoxPrawdopodobienstwoKrzyzowania);
                string liczba = textBoxPrawdopodobienstwoKrzyzowania.Text.Replace(".", ",");
                return Double.Parse(liczba);
            }
            set
            {
                textBoxPrawdopodobienstwoKrzyzowania.Text = value.ToString();
            }
        }

        public double PrawdopodobienstwoMutacji
        {
            get
            {
                WypelnianieKontrolek.wpiszZeroDoTextBoxJesliPusty(textBoxPrawdopodobienstwoMutacji);
                string liczba = textBoxPrawdopodobienstwoMutacji.Text.Replace(".", ",");
                return Double.Parse(liczba);
            }
            set
            {
                textBoxPrawdopodobienstwoMutacji.Text = value.ToString();
            }
        }

        public int WielkoscPopulacji
        {
            get
            {
                WypelnianieKontrolek.wpiszZeroDoTextBoxJesliPusty(textBoxWielkoscPopulacji);
                return Int32.Parse(textBoxWielkoscPopulacji.Text);
            }
            set
            {
                textBoxWielkoscPopulacji.Text = value.ToString();
            }
        }

        public int DokladnoscKodowania
        {
            get
            {
                WypelnianieKontrolek.wpiszZeroDoTextBoxJesliPusty(textBoxDokladnoscKodowania);
                return Int32.Parse(textBoxDokladnoscKodowania.Text);
            }
            set
            {
                textBoxDokladnoscKodowania.Text = value.ToString();
            }
        }

        public List<AbstractKodowanie> Kodowania
        {
            get
            {
                if (comboBoxKodowanie.SelectedItem != null)
                {

                    if ((string)comboBoxKodowanie.SelectedItem == NazwaKodowanieBinarne)
                    {
                        List<AbstractKodowanie> listaKodowan = new List<AbstractKodowanie>();
                        for (int i = 0; i < IloscParametrow; i++)
                        {
                            listaKodowan.Add(new KodowanieBinarne(DokladnoscKodowania, zwrocPoczatekPrzedzialu(i),
                                                    zwrocKoniecPrzedzialu(i)));
                        }
                        return listaKodowan;
                    }
                    else
                    {
                        List<AbstractKodowanie> listaKodowan = new List<AbstractKodowanie>();
                        for (int i = 0; i < IloscParametrow; i++)
                        {
                            listaKodowan.Add(new KodowanieGraya(DokladnoscKodowania, zwrocPoczatekPrzedzialu(i),
                                                    zwrocKoniecPrzedzialu(i)));
                        }
                        return listaKodowan;
                    }
                }
                else
                {
                    return new List<AbstractKodowanie>();
                }
            }
            set
            {
                if (!comboBoxKodowanie.Items.Contains(value))
                {
                    comboBoxKodowanie.Items.Add(value);
                }
                comboBoxKodowanie.SelectedItem = value;
            }
        }

        public double[] PoczatekDziedziny
        {
            get
            {
                return zwrocWartosciPoczatkowe();
            }
        }

        public double[] KoniecDziedziny
        {
            get
            {
                return zwrocWartosciKoncowe();
            }
        }

        private double[] zwrocWartosciPoczatkowe()
        {
            return parsujWartosci("1;1;1;1;1");
        }

        private double[] zwrocWartosciKoncowe()
        {
            return parsujWartosci("15;15;15;15;15");
        }

        private double[] parsujWartosci(string lancuch)
        {
            string[] stringi = lancuch.Split(";".ToCharArray());
            double[] wartosci = new double[stringi.Length];
            for (int i = 0; i < stringi.Length; i++)
            {
                wartosci[i] = Double.Parse(stringi[i]);
            }
            return wartosci;
        }

        private double zwrocKoniecPrzedzialu(int indeksParametru)
        {
            return zwrocWartosciKoncowe()[indeksParametru];
        }

        private double zwrocPoczatekPrzedzialu(int indeksParametru)
        {
            return zwrocWartosciPoczatkowe()[indeksParametru];
        }

        

        public int IloscParametrow
        {
            get
            {
                return zwrocWartosciPoczatkowe().Length;
            }
        }

        

        

        public bool SukcesjaElitarna
        {
            get
            {
                return checkBoxSukcesjaElitarna.Checked;
            }
            set
            {
                checkBoxSukcesjaElitarna.Checked = value;
            }
        }

        public int WielkoscElity
        {
            get
            {
                WypelnianieKontrolek.wpiszZeroDoTextBoxJesliPusty(textBoxSukcesjaElitarna);
                return Int32.Parse(textBoxSukcesjaElitarna.Text);
            }
            set
            {
                textBoxSukcesjaElitarna.Text = value.ToString();
            }
        }

        

        #endregion

        public UserControlParametry()
        {
            InitializeComponent();
            inicjalizujParametry();
        }

        private void wypelnijComboBoxKodowanie()
        {
            comboBoxKodowanie.Items.Add(NazwaKodowanieBinarne);
            comboBoxKodowanie.Items.Add(NazwaKodowanieGraya);
            comboBoxKodowanie.SelectedIndex = 0;
        }
   

        private void inicjalizujParametry()
        {
            wypelnijComboBoxKodowanie();
        }
    }
}
